package middle;

import java.util.*;

/**
 * MT16 公交车
 * @author d3y1
 */
public class MT16{
    private static HashSet<Integer>[] adj;

    public static void main(String[] args){
        Scanner in = new Scanner(System.in);

        while(in.hasNext()){
            solution(in);
        }
    }

    /**
     * 模拟法: bfs
     * @param in
     */
    private static void solution(Scanner in){
        // 公交站台数
        int n = in.nextInt();
        // 公交车数(线路数)
        int m = in.nextInt();
        // 为了降低构图复杂度, 每个公交车线路都建立一个虚拟节点, 使得公交车站之间只能通过虚拟节点相连接
        int V = n+m;

        // 构建图 点的范围[1:V]
        adj = new HashSet[V+1];
        for(int i=1; i<=V; i++){
            adj[i] = new HashSet<>();
        }
        int v,t;
        for(int i=1; i<=m; i++){
            // 当前公交车站点数
            t = in.nextInt();
            for(int j=1; j<=t; j++){
                v = in.nextInt();
                adj[n+i].add(v);
                adj[v].add(n+i);
            }
        }

        System.out.println(bfs(n));
    }

    /**
     * 广度优先搜索
     * @param terminal
     * @return
     */
    private static int bfs(int terminal){
        HashSet<Integer> visited = new HashSet<>();
        Queue<Integer> queue = new LinkedList<>();

        visited.add(1);
        queue.offer(1);

        int dist = 0;
        int size;
        while(!queue.isEmpty()){
            Integer u;
            dist++;
            size = queue.size();
            for(int i=1; i<=size; i++){
                u = queue.poll();
                for(Integer v: adj[u]){
                    if(v == terminal){
                        return dist/2;
                    }
                    if(!visited.contains(v)){
                        visited.add(v);
                        queue.offer(v);
                    }
                }
            }
        }

        return -1;
    }
}